package com.atguigu.lease.common.jwt;

import com.atguigu.lease.common.advice.CostomReturnException;
import com.atguigu.lease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;


/**
 * token工具类，用于生成token以及获取token
 */

public class JwtUtil {

    //token过期时间
    private static long tokenExpiration = 6 * 60 * 60 * 1000L;
    //token加密规则
    private static SecretKey tokenSignKey = Keys.hmacShaKeyFor("M0PKKI6pYGVWWfDZw90a0lTpGYX1d4AQ".getBytes());


    // 生成token密文,参数是登录用户id以及用户名
    public static String createToken(Long userId, String username) {
        //创建者模式
        String token = Jwts.builder().
                setSubject("USER_INFO").//标识jwt用于主题，场景
                setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)).//token有效期开始计算，从获取到开始
                claim("userId", userId).//自定义token内容，添加userid
                claim("username", username).//自定义token字段，添加username
                signWith(tokenSignKey).//使用密钥加密
                compressWith(CompressionCodecs.GZIP).//压缩token
                compact();//构建完成并返回为最终的字符串内容
        return token;
    }

    //获取token
    public static Claims parseToken(String token) {
        try {
            //获取token并解析
            Jws<Claims> claimsJws = Jwts.parserBuilder().
                    setSigningKey(tokenSignKey).
                    build().parseClaimsJws(token);
            return claimsJws.getBody();

        } catch (ExpiredJwtException e) {
            //token过期，抛出过期异常
            throw new CostomReturnException(ResultCodeEnum.TOKEN_EXPIRED);
        } catch (JwtException e) {
            //错误时抛出非法token异常
            throw new CostomReturnException(ResultCodeEnum.TOKEN_INVALID);
        }
    }
}
